import axios from "axios"
import URLS from './GlobalVariable'
import {Message} from 'element-ui';
import fi from "element-ui/src/locale/lang/fi";

const urls = URLS.urls;

axios.defaults.withCredentials = true;

// axios 请求拦截器，拦截code为-1的内容
axios.interceptors.response.use(res => {
  if (res.data.code === -1)
    Message.error(res.data.msg);
  else
    return res;
}, (err) => {
  console.log(err);
  if (err.response.status === 405)
    Message.warning("请先登录");
});


class Apis {
  /**
   * 即将上线
   */
  willOpen() {
    Message.info("正在开发中，即将上线")
  }

  /**
   * 登陆
   * @param username 用户名
   * @param password 密码
   * @param dealRes 回调函数
   */
  login(username, password, dealRes) {
    axios.post(urls.loginAPIURL, {
      'username': username,
      'password': password
    }).then(res => dealRes(res.data.data));
  }

  /**
   * 注册
   * @param username 用户名
   * @param password 密码
   * @param dealRes 回调函数
   */
  register(username, password, dealRes) {
    axios.post(urls.registerURL, {
      'username': username,
      'password': password
    }).then(res => dealRes(res.data.data));
  }

  /**
   * 获取个人信息
   * @param dealRes 回调函数
   */
  getPersonalInformation(dealRes) {
    axios.get(urls.getPersonalInformationURL,
      {params: {}}
    ).then(res => dealRes(res.data.data))
  }

  /**
   * 修改个人信息
   * @param head 头像
   * @param nickname 昵称
   * @param sex 性别
   * @param province 省
   * @param city 市
   * @param introduction 签名
   * @param dealRes 回调函数
   */
  modifyPersonalInformation(head, nickname, sex, province, city, introduction, dealRes) {
    let data = new FormData();
    data.append('picture', '');
    data.append('file', head);
    data.append('nickname', nickname);
    data.append('sex', sex === '男');
    data.append('province', province);
    data.append('city', city);
    data.append('introduction', introduction);
    axios.post(urls.modifyPersonalInformationURL, data, {
      params: data,
      headers: {"Content-Type": "multipart/form-data"}
    }).then(res => dealRes(res.data.data));
  }

  /**
   * 登出
   * @param dealRes 回调函数
   */
  logout(dealRes) {
    axios.post(urls.logoutURL).then(
      res => dealRes(res.data.data)
    );
  }

  /**
   * 获取获取使用天数、笔记数、收藏数
   * @param dealRes 回调函数
   */
  getNoteNumber(dealRes) {
    axios.get(urls.notesNumberURL).then(res => dealRes(res.data.data))
  }

  /**
   * 新建文件夹
   * @param path
   * @param dealRes 回调函数
   */
  createFolder(path, dealRes) {
    axios.post(urls.createFolderURL, {
      path: path
    }).then(res => dealRes(res.data.data))
  }

  /**
   * 上传文件/夹
   * @param path 目标路径
   * @param files 文件列表
   * @param dealRes 回调函数
   */
  uploadFolder(path, files, dealRes) {
    let data = new FormData();
    data.set("path", path);
    for (let i = 0; i < files.length; i++)
      data.set("folder", files[i]);
    axios.post(urls.uploadFolderURL, data, {
      headers: {"Content-Type": "multipart/form-data"}
    }).then(res => dealRes(res.data.data));
  }

  /**
   * 删除文件/夹
   * @param path 目标路径
   * @param dealRes 回调函数
   */
  deleteFolderOrFile(path, dealRes) {
    axios.post(urls.deleteFolderURL, {}, {
      params: {
        path: path
      }
    }).then(res => dealRes(res.data.data))
  }

  /**
   * 获取文件夹（树形）
   * @param dealRes 回调函数
   */
  getFolders(dealRes) {
    axios.get(urls.getFoldersURL).then(res => dealRes(res.data.data));
  }

  /**
   * 恢复文件/文件夹
   * @param path 目标文件/文件夹路径
   * @param dealRes 回调函数
   */
  renewFolder(path, dealRes) {
    axios.post(urls.renewFolderURL, {}, {
      params: {
        path: path
      }
    }).then(res => dealRes(res.data.data));
  }

  /**
   * 永久删除文件/夹
   * @param path 目标路径
   * @param dealRes 回调函数
   */
  deleteFolderForever(path, dealRes) {
    axios.delete(urls.deleteFolderForeverURL, {
      params: {
        path: path
      }
    }).then(res => dealRes(res.data.data));
  }

  /**
   * 上传文件/图片
   * @param path 目标路径
   * @param file 文件
   * @param dealRes 回调函数
   */
  uploadFile(path, file, dealRes) {
    let data = new FormData();
    data.set("file", file);
    data.set("path", path);
    axios.post(urls.uploadFileURL, data, {
      headers: {"Content-Type": "multipart/form-data"}
    }).then(res => dealRes(res.data.data));
  }

  /**
   * 文件加星
   * @param path 目标文件路径
   * @param dealRes 回调函数
   */
  fileAddStar(path, dealRes) {
    axios.post(urls.fileAddStarURL, {}, {
      params: {
        path: path
      }
    }).then(res => dealRes(res.data.data));
  }

  /**
   * 文件置顶
   * @param path 目标文件路径
   * @param dealRes 回调函数
   */
  fileAddTop(path, dealRes) {
    axios.post(urls.fileAddTopURL, {}, {
      params: {
        path: path
      }
    }).then(res => dealRes(res.data.data));
  }

  /**
   * 文件取消置顶
   * @param path 文件路径
   * @param dealRes 回调函数
   */
  fileCancelTop(path, dealRes) {
    axios.post(urls.fileCancelTopURL, {}, {
      params: {
        path: path
      }
    }).then(res => dealRes(res.data.data));
  }

  /**
   * 获取文件信息
   * @param path 目标文件路径
   * @param dealRes 回调函数
   */
  getFileInfo(path, dealRes) {
    axios.get(urls.getFileInfoURL, {
      params: {
        path: path
      }
    }).then(res => dealRes(res.data.data));
  }

  fileCancelStar(path, dealRes) {
    axios.post(urls.fileCancelStarURL, {}, {
      params: {
        path: path
      }
    }).then(res => dealRes(res.data.data));
  }

  /**
   * 为文件新建标签
   * @param path 目标文件路径
   * @param name 标签名
   * @param dealRes 回调函数
   */
  addSignToFile(path, name, dealRes) {
    axios.post(urls.newSignFileURL, {
      path: path,
      username: '',
      id: '',
      name: name
    }).then(res => dealRes(res.data.data));
  }

  /**
   * 新建标签
   * @param name 标签名
   * @param dealRes 回调函数
   */
  createSign(name, dealRes) {
    axios.post(urls.createSignURL, {}, {
      params: {
        name: name
      }
    }).then(res => dealRes(res.data.data));
  }

  /**
   * 获取所有标签
   * @param dealRes 回调函数
   */
  getAllSign(dealRes) {
    axios.get(urls.getAllSignURL).then(res => dealRes(res.data.data));
  }

  /**
   * 获取文件标签
   * @param path 文件路径
   * @param dealRes 回调函数
   */
  getFileSign(path, dealRes) {
    axios.get(urls.getFileSignURL, {
      params: {
        'path': path
      }
    }).then(res => dealRes(res.data.data));
  }

  /**
   * 删除文件标签
   * @param path 文件路径
   * @param sign 标签名
   * @param dealRes 回调函数
   */
  delSignFile(path, sign, dealRes) {
    axios.delete(urls.delSignFileURL, {
      data: {
        'path': path,
        'username': '',
        'id': '',
        'name': sign
      }
    }).then(res => dealRes(res.data.data))
  }

  /**
   * 保存笔记
   * @param file 笔记文件
   * @param path 路径
   * @param title 标题
   * @param pics 图片列表
   * @param summary 摘要
   * @param dealRes 回调函数
   */
  saveNote(file, path, title, pics, summary, dealRes) {
    let data = new FormData();
    data.append("file", file);
    data.append("path", path);
    data.append("title", title);
    data.append("summary", summary);
    for (let i = 0; i < pics.length; i++)
      data.append("pics", pics[i]);
    axios.post(urls.saveNoteURL, data, {
      headers: {"Content-Type": "multipart/form-data"}
    }).then(
      res => {
        dealRes(res.data.data)
      }
    )
  }

  /**
   * 获取文件URL路径
   * @param path 路径
   * @param dealRes 回调函数
   */
  getFilePath(path, dealRes) {
    axios.get(urls.getFilePathURL, {
      params: {
        path: path
      }
    }).then(res => dealRes(res.data.data));
  }

  /**
   * 搜索文件
   * @param orderName 排序依据
   * @param ascending 是否升序
   * @param keyWords 关键字
   * @param dealRes 回调函数
   * @param args 搜索参数
   */
  searchFiles(orderName, ascending, keyWords, args, dealRes) {
    if (keyWords === null)
      keyWords = '';
    if (args.filePath === undefined)
      args.filePath = null;
    if (args.signName === undefined)
      args.signName = null;
    if (args.be_share === undefined)
      args.be_share = false;
    if (args.be_delete === undefined)
      args.be_delete = false;
    if (args.be_new === undefined)
      args.be_new = false;
    if (args.be_star === undefined)
      args.be_star = false;
    if (args.be_delete) {
      axios.get(urls.searchDeletedFileURL, {
        params: {
          orderName: orderName,
          ascending: ascending,
          be_deleted: true,
          keyWords: keyWords
        }
      }).then(res => {
        console.log(res.data.data[1]);
        dealRes(res.data.data)
      });
      return;
    }
    axios.get(urls.searchFilesURL, {
      params: {
        orderName: orderName,
        ascending: ascending,
        filePath: args.filePath,
        name: args.signName,
        be_star: args.be_star,
        be_share: args.be_share,
        be_deleted: args.be_delete,
        be_new: args.be_new,
        keyWords: keyWords
      }
    }).then(res => {
      this.removeSuffix(res.data.data);
      dealRes(res.data.data)
    });
  }

  /**
   * 移除后缀
   * @param strings 原串集合
   * @return 处理后的串
   */
  removeSuffix(strings) {
    for (let i = 0; i < strings.length; i++)
      strings[i].title = strings[i].title.substr(0, strings[i].title.lastIndexOf("."));
  }

  /**
   * 路径搜索
   * @param orderName 排序依据
   * @param ascending 排序方式
   * @param args 参数
   * @param keyWords 关键字
   * @param dealRes 回调函数
   */
  searchFilesByPath(orderName, ascending, keyWords, args, dealRes) {
    if (keyWords === null)
      keyWords = '';
    axios.get(urls.searchNextFileURL, {
      params: {
        orderName: orderName,
        ascending: ascending,
        filePath: args.filePath,
        keyWords: keyWords
      }
    }).then(res => {
      this.removeSuffix(res.data.data[1]);
      dealRes(res.data.data);
    });
  }

  /**
   * 导入Word
   * @param path 目标路径
   * @param file word文件
   * @param dealRes 回调函数
   */
  importWord(path, file, dealRes) {
    let data = new FormData();
    data.append("file", file);
    data.append("path", path);
    axios.post(urls.importWordURL, data, {
      headers: {"Content-Type": "multipart/form-data"}
    }).then(
      res => {
        dealRes(res.data.data)
      }
    )
  }

  /**
   * 重命名文件/文件夹
   * @param oldPath 旧路径
   * @param newPath 新路径
   * @param dealRes 回调函数
   */
  renameFileOrFolder(oldPath, newPath, dealRes) {
    axios.post(urls.renameFileURL, {}, {
      params: {
        oldPath: oldPath,
        newPath: newPath
      }
    }).then(res => dealRes(res.data.data))
  }

  /**
   * 移动文件或文件夹
   * @param origin 源路径
   * @param targetFolder 目标文件夹
   * @param dealRes 回调函数
   */
  moveFileOrFolder(origin, targetFolder, dealRes) {
    let newPath = targetFolder;
    let tmp = origin.split("/");
    newPath += tmp[tmp.length - 1];
    console.log(origin);
    console.log(newPath);
    this.renameFileOrFolder(origin, newPath, res => {
      res.replace(/重命名/g, "移动");
      console.log(res);
      dealRes(res);
    });
  }

  /**
   * 导出为Word
   * @param filePath 文件路径
   * @param dealRes 回调函数
   */
  exportWord(filePath, dealRes) {
    axios.get(urls.exportWordURL, {
      params: {
        path: filePath
      }
    }).then(res => dealRes(res.data.data));
  }

  /**
   * 导出为PDF
   * @param filePath 文件路径
   * @param dealRes 回调函数
   */
  exportPDF(filePath, dealRes) {
    axios.get(urls.md2PdfURL, {
      params: {
        path: filePath
      }
    }).then(res => dealRes(res.data.data));
  }

  /**
   * 编辑文件信息
   * @param operateFile 操作文件信息
   * @param dealRes 回调函数
   */
  editFile(operateFile, dealRes) {
    axios.post(urls.editFileURL, {}, {
      params: operateFile
    }).then(res => dealRes(res.data.data))
  }

  /**
   * 粘贴文件
   * @param origin 原文件/夹路径
   * @param target 目标文件夹路径
   * @param dealRes 回调函数
   */
  pasteFile(origin, target, dealRes) {
    axios.post(urls.pasteFileURL, {}, {
      params: {
        oldPath: origin,
        newPath: target
      }
    }).then(res => dealRes(res.data.data))
  }

  /**
   * 获取分享链接
   * @param path
   * @param dealRes
   */
  getShareLink(path, dealRes) {
    axios.get(urls.shareFileURL, {
      params: {
        path: path
      }
    }).then(res => dealRes(res.data.data));
  }

  /**
   * 读取图片内容
   * @param path 图片路径
   * @param dealRes 回调函数
   */
  readFileContent(path, dealRes) {
    axios.get(path, {responseType: 'arraybuffer'}).then(res => {
      if (res.data.byteLength !== 366)
        dealRes('data:image/png;base64,' + btoa(new Uint8Array(res.data).reduce((data, byte) => data + String.fromCharCode(byte), '')));
      else
        dealRes(res.data.data);
    });
  }

  /**
   * 修改密码
   * @param currentPwd 原密码
   * @param newPwd 新密码
   * @param dealRes 回调函数
   */
  editPassword(currentPwd, newPwd, dealRes) {
    axios.post(urls.changePwdURL, {}, {
      params: {
        currentPwd: currentPwd,
        newPwd: newPwd
      }
    }).then(res => dealRes(res.data.data));
  }

}

const apis = new Apis();
export default {
  install: function (Vue) {
    Vue.prototype.showMessage = (res) => Message.success(res);
    Vue.prototype.apis = apis;
  }
}
